package uds.geoloc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import uds.data.HashMapRessources;
import uds.data.InformationRessource;
import uds.data.POI_Database;
import uds.data.POI_Entry;
import uds.data.UserPreference;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

// PlanActivity est l'activité qui permet d'afficher le plan
public class PlanActivity extends MapActivity implements LocationListener
{
	// Initialisation des variables nécessaires
	private Context context = this;
	private MapView mapView;
	private LocationManager lm;
	private MapController mc;
	private MyLocationOverlay myLocation = null;
	private double lat = 0;
	private double lng = 0;
	private POI_Database base_poi;
	private UserPreference usr_pref;
	private ArrayList<POI_Entry> lst_selected_itemized;
	private ArrayList<String> liste_res;
	private List<Overlay> mapOverlays;
	private ItemizedOverlay selected_item;
	private Drawable selected_drawable;
	private String provenance = "Plan";
	private String id;
	private String type_ressource = "batiment";
	private String campus_ref;
	private String id_campus_ref;
	private POI_Entry poi_campus_ref;
	
	private HashMap<String, InformationRessource> donnees;
	private List<String> listeRessources;
	
	@Override
    public void onCreate(Bundle savedInstanceState) 
	{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.plan);
        
        // Initialisation des bases de données
        base_poi = new POI_Database(this);
        usr_pref = new UserPreference(this);
        base_poi.open();
        
        // Initialisation des composants
        HashMapRessources.initialisationHashMapRessources(this);
        donnees = HashMapRessources.getHashMap();
        listeRessources = base_poi.getListeRessources();
        mapView = (MapView) this.findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);
        
        mc = mapView.getController();
        mc.setZoom(12);
        
        // Initialisation du "localisateur"
        lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, this);
        
        myLocation = new MyLocationOverlay(getApplicationContext(), mapView);
        mapView.getOverlays().add(myLocation);
        myLocation.enableMyLocation();
        myLocation.enableCompass();
        
        // Récupération des Bundles et traitement en fonction
        id = "";
        Bundle objetbunble  = this.getIntent().getExtras();
	    if (objetbunble != null && objetbunble.containsKey("provenance")) 
	    {
	    	provenance = this.getIntent().getExtras().getString("provenance");
	    	
	    	if (objetbunble != null && objetbunble.containsKey("type_ressource") && objetbunble.containsKey("id"))
	    	{
	    		type_ressource = this.getIntent().getExtras().getString("type_ressource");
	    		id = this.getIntent().getExtras().getString("id");
	    	}
	    	
	    	else if (objetbunble != null && objetbunble.containsKey("type_ressource")) 
		    {
		    	type_ressource = this.getIntent().getExtras().getString("type_ressource");
		    }
		    
	    	else if (objetbunble != null && objetbunble.containsKey("id")) 
		    {
		    	id = this.getIntent().getExtras().getString("id");
		    	type_ressource = base_poi.getPOI_EntryWithId(id).getType();
		    }
		    //System.out.println("Provenance : [" + provenance + "] - Id : [" + id + "] - Type ressource : [" + type_ressource + "]");
	    }
	    
	    // Interprétation des bundles en fonction de la provenance
	    if (provenance.equals("Information") || provenance.equals("Campus1") || provenance.equals("Campus2") || provenance.equals("Ressource2"))
	    {
	    	System.out.println("Récupéré : " + id );
	    	
	    }
	    
	    if (provenance.equals("Ressource1"))
	    {
	    	System.out.println("Affichage des ressources : " + type_ressource);
	    }
	    
	    if(provenance.equals("Plan") && usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION).equals("non"))
	    {
	    	campus_ref = usr_pref.getPreference(UserPreference.ATR_CAMPUS_REF);
	    	ArrayList<POI_Entry> lst_campus = base_poi.getPOI_EntryWithType("campus");
	    	for ( POI_Entry entry : lst_campus)
	    	{
	    		if (entry.getName().equals(campus_ref))
	    		{
	    			id_campus_ref = entry.getId();
	    			poi_campus_ref = entry;
	    		}
	    	}
	    }
	    
	    // Affichage centré sur la position de l'utilisateur si la provenance est le menu principal
        myLocation.runOnFirstFix(new Runnable() 
        {
            public void run() 
            {
            	if (provenance.equals("Plan") && usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION).equals("oui"))
            	{
            		mc.animateTo(myLocation.getMyLocation());
            		mc.setZoom(17);
            	}
            }
        });
        
        liste_res = base_poi.getListeRessources();
        boolean continuer_boucle = true;
        int pos_bat = 0;
        // On détermine la position de la ressource sélectionnée dans liste_res (bâtiment par défaut)
        for ( int i = 0 ; i < liste_res.size() && continuer_boucle ; i++)
        {
        	if (liste_res.get(i).equals(type_ressource))
        	{
        		pos_bat = i;
        		continuer_boucle = false;
        	}
        }
        // Mise en place du Spinner
        Spinner spinner_ressources = (Spinner) findViewById(R.id.spinnerPlan);
        spinner_ressources.setAdapter(new MyAdapter(this, R.layout.spinnerperso, listeRessources));
        spinner_ressources.setSelection(pos_bat); 
        mapOverlays = mapView.getOverlays();
    	
        // Implémentation du OnItemSelectedListener sur le spinner
        spinner_ressources.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        {
			@Override
			public void onItemSelected(AdapterView<?> l, View view, int position, long id_f) 
			{
				base_poi.open();
				if (!mapOverlays.isEmpty())
				{ 
					mapOverlays.clear(); // On vide la liste
				}
				mapOverlays.add(myLocation); // Ajout de ma position
				String ressource = (String) l.getSelectedItem();
				
				lst_selected_itemized = base_poi.getPOI_EntryWithType(ressource.toString()); // Récupération de la liste des POI d'un type précis
				
				selected_drawable = context.getResources().getDrawable(donnees.get(ressource).getId_drawable()); // Récupération de l'icône du type
				
				selected_item = new ItemizedOverlay(selected_drawable, context);
	        	for (POI_Entry entry : lst_selected_itemized)
	        	{
	    			float latitude = (float) (Float.parseFloat(entry.getLatitude())*1E6) ;
	    			float longitude = (float) (Float.parseFloat(entry.getLongitude())*1E6) ;
	    	        GeoPoint geoPoint = new GeoPoint((int) latitude,(int) longitude);
	    	        OverlayItem overlayitem = new OverlayItem(geoPoint, entry.getName(), entry.getId());
	    	        selected_item.addOverlayItem(overlayitem);
	    		    if (provenance.equals("Information") || provenance.equals("Campus1") || provenance.equals("Campus2") || provenance.equals("Ressource2"))
	    		    {
	    		    	if (entry.getId().equals(id)) // Vérification si c'est le bâtiment sélectionné
	    		    	{
		    		    	mc.setCenter(geoPoint);
		    		    	mc.setZoom(18);
	    		    	}
	    		    }
	        	}
	        	if (provenance.equals("Plan") && usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION).equals("non"))
	        	{
	        		float lat_ref = (float) (Float.parseFloat(poi_campus_ref.getLatitude())*1E6);
	        		float lng_ref = (float) (Float.parseFloat(poi_campus_ref.getLongitude())*1E6);
	        		GeoPoint p_campus = new GeoPoint((int) lat_ref, (int) lng_ref);
	        		mc.setCenter(p_campus); // On centre sur le campus par défaut, si la géolocalisation est desactivé.
	        		mc.setZoom(18);
	        	} 
	        	
	        	if(provenance.equals("Information2") )
	        	{
	        		float lat_ref = (float) (Float.parseFloat(base_poi.getPOI_EntryWithId(id).getLatitude())*1E6);
	        		float lng_ref = (float) (Float.parseFloat(base_poi.getPOI_EntryWithId(id).getLongitude())*1E6);
	        		GeoPoint p_bat = new GeoPoint((int) lat_ref, (int) lng_ref);
	        		mc.setCenter(p_bat); // On centre sur le POI choisi
	        		mc.setZoom(19);
	    		}
				mapOverlays.add(selected_item);
				mapView.invalidate(); // Permet de rafraichir les points
				
				base_poi.close();
			}

			@Override
			public void onNothingSelected(AdapterView<?> l) 
			{
				System.out.println("Rien de sélectionné !");
			}
        });
        
        base_poi.close();
    }

    
    @Override
    protected boolean isRouteDisplayed()
    {
    	return false;
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
		if (keyCode == KeyEvent.KEYCODE_S)
		{
			mapView.setSatellite(!mapView.isSatellite()); // Pour passer en mode satellite
			return true;
		}
		return super.onKeyDown(keyCode, event);
    }
    
    @Override
    public void onLocationChanged(Location location) // Fonction de mise à jour de la position automatique
    {
    	 if (provenance.equals("Plan"))
    	 {
    		 lat = location.getLatitude();
    		 lng = location.getLongitude();
    		 GeoPoint p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
    		 mc.animateTo(p); // Recentre la carte sur la nouvelle position
    		 mc.setCenter(p);
    	 }
    }
    
    @Override
    public void onProviderDisabled(String provider)
    {
    	// TODO Auto-generated method stub
    }
    
    @Override
    public void onProviderEnabled(String provider)
    {
    	// TODO Auto-generated method stub
    }
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {
    	// TODO Auto-generated method stub
    }
    
    // Implémentation de la ListView personnalisée
    public class MyAdapter extends ArrayAdapter<String>{
    	 
    	private Context myContext;
    	
        public MyAdapter(Context context, int textViewResourceId,   List<String> listeRessources) {
            super(context, textViewResourceId, listeRessources);
            this.myContext = context;
        }
 
        @Override
        public View getDropDownView(int position, View convertView,ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }
 
        // Implémentation de la view d'une ligne de la ListView personnalisée
        public View getCustomView(int position, View convertView, ViewGroup parent) {
 
            LayoutInflater inflater = getLayoutInflater();
            View row=inflater.inflate(R.layout.spinnerperso, parent, false);
            TextView label=(TextView)row.findViewById(R.id.nomRessource);

            if (donnees.get(listeRessources.get(position)).getDisplay_name() == null){
            
            } 
            else 
            {
            	label.setText((CharSequence) donnees.get(listeRessources.get(position)).getDisplay_name());
            }
            
            ImageView icon=(ImageView)row.findViewById(R.id.imageRessource);
            if(donnees.get(listeRessources.get(position)).getId_drawable() == 0){

            } else {
            	icon.setImageResource((Integer) donnees.get(listeRessources.get(position)).getId_drawable());
            }
			
            return row;
        }
        
    }
}